package messages;

import Model.Exceptions.FileIdException;
import Model.Exceptions.PathFileException;
import Model.FileId;
import Model.PathFile;
import java.net.UnknownHostException;
/**
 * La classe FileRequest correspond au signal à envoyer pour une demande 
 * de transfert de fichier à un utilisateur distant.
 * 
 * @author      Frank Djomo
 * @author      Christelle SIAGO HAPPI
 * @author      djomopoueme@gmail.com
 * @author      christelle.siagohappi@gmail.com
 * @version     1.0
 */
public class FileRequest extends Message {
    /**
    * 
    */
    private static final long serialVersionUID = 6350516826089170132L;
    private PathFile m_Name;
    private FileId m_FileId;
    private long m_Size;

    /**
    * Constructeur
    * @param  login     Login de l'utilisateur local
    * @param  path      PathFile du fichier à transferer 
    * @param  fileid    FileID du fichier à transferer
    * @param  size      Taille du fichier à transferer
    * @throws UnknownHostException   
    */
    public FileRequest(String login, PathFile path, FileId fileid, long size) throws UnknownHostException {
        super(login);
        this.m_Name = new PathFile(path);
        this.m_FileId = fileid;
        this.m_Size = size;
    }
    /**
    * Constructeur
    * @param  login     Login de l'utilisateur local
    * @param  path      PathFile du fichier à transferer 
    * @param  fileid    FileID du fichier à transferer
    * @param  size      Taille du fichier à transferer
    * @throws UnknownHostException   
    *  @throws PathFileException
    */
    public FileRequest(String login, String path, FileId fileid, int size) throws UnknownHostException,PathFileException {
        this(login,new PathFile(path), fileid, size);
    }
    /**
    * Constructeur
    * @param  login     Login de l'utilisateur local
    * @param  path      PathFile du fichier à transferer 
    * @param  fileid    FileID du fichier à transferer
    * @param  size      Taille du fichier à transferer
    * @throws UnknownHostException
    * @throws FileIdException  
    */
    public FileRequest(String login,PathFile path, int fileid, int size) throws UnknownHostException, FileIdException{
        this(login,path, new FileId(fileid), size);
    }
    /**
    * Constructeur
    * @param  login     Login de l'utilisateur local
    * @param  path      PathFile du fichier à transferer 
    * @param  fileid    FileID du fichier à transferer
    * @param  size      Taille du fichier à transferer
    * @throws UnknownHostException
    * @throws FileIdException
    * @throws PathFileException
    */
    public FileRequest(String login,String path, int fileid, int size ) throws UnknownHostException, PathFileException, FileIdException {
        this(login, path, new FileId(fileid), size);
    }
    /**
    * @return PathFile du fichier à transferer
    */
    public PathFile getName() {
        return this.m_Name;
    }
    /**
    * @return FileID du fichier à transferer
    */
    public FileId getFileId() {
        return this.m_FileId;
    }
    /**
    * @return Taille du fichier à transferer
    */
    public long getSize() {
        return this.m_Size;
    }
    @Override
    public String toString() {
        return super.toString() + "Name : " + this.getName().getName() + "; FileId : " + this.getFileId() + "; Size : " + this.getSize();
    }
    /**
    * Teste si deux objects FileRequest dont identiques.
    * @return    <code>true</code> si egaux 
    *            <code>false</code> sinon 
    */
    @Override
    public boolean equals(Object o){
        return (this.getClass().isInstance(o) && this.hashCode()==(((FileRequest)o).hashCode()));
    }
    /**
    * Genere un hashcode pour les objets FileId.
    * @return valeur du hashcode
    */
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 59 * hash + (this.m_Name != null ? this.m_Name.hashCode() : 0);
        hash = 59 * hash + (this.m_FileId != null ? this.m_FileId.hashCode() : 0);
        hash = 59 * hash + (int) (this.m_Size ^ (this.m_Size >>> 32));
        return hash;
    }
}